#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <cstring>
#include <unistd.h>


int main(int argc,char* argv[])
{
    //程序启动
    if(argc!=2)
    {
        std::cerr<<"Usage: udpserver port"<<std::endl;
        return 1;
    }
    //创建socket网络文件
    int sock=socket(AF_INET,SOCK_DGRAM,0);//ipv4协议，套接字类型（传输udp/tcp）,套接字协议（0：默认协议）
    if(sock < 0)
    {
        std::cerr<<"socket"<<std::endl;
        return 2;
    }
    std::cout<<"sock:"<<sock<<std::endl;
    //创建套接字结构体-填入ip及port
    struct sockaddr_in local;
    memset(&local,0,sizeof(local));//初始化结构体
    local.sin_family=AF_INET;//通信协议 
    local.sin_port=htons(atoi(argv[1]));//网络端口传输时需要进行转换格式
    local.sin_addr.s_addr=htons(INADDR_ANY);//云服务器不建议绑定明确的ip，建议使用INADDR_ANY绑定该主机所有设备
    //将网络文件与套接字进行绑定（强相关）
    if(bind(sock,(struct sockaddr*)&local,sizeof(local))==-1)
    {
        std::cout<<"bind"<<std::endl;
        return 3;
    }
    //进行获取远端消息并回复
    while(1)
    {
        char buffer[128]={0};
        //接收远端的套接字信息-便于进行回复
        struct sockaddr_in peer; 
        socklen_t len=sizeof(peer);
        ssize_t s=recvfrom(sock,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&peer,&len); 
        if(s>0)
        {
            buffer[s]=0;
            std::cout<<"client# "<<buffer<<std::endl;
            sendto(sock,buffer,strlen(buffer),0,(struct sockaddr*)&peer,len);
        }
    }
    close(sock);
    return 0;
}
